package cn.gongxi.weibo.controller;

import cn.gongxi.weibo.common.response.JsonResult;
import cn.gongxi.weibo.common.response.StatusCode;
import cn.gongxi.weibo.pojo.dto.UserLoginDTO;
import cn.gongxi.weibo.pojo.dto.UserRegDTO;
import cn.gongxi.weibo.pojo.entity.User;
import cn.gongxi.weibo.pojo.mapper.UserMapper;
import cn.gongxi.weibo.pojo.vo.UserVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import lombok.extern.slf4j.XSlf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;

import javax.servlet.http.HttpSession;
import java.util.List;

/**
 * @slf4j 注解
 * 专门用于打印注解  为该类创建一个日志对象log
 * 使用该日志对象即可打印不同级别的日志
 * log.trace("追踪信息")[打印调试信息，一般用于开发测试阶段]
 * log.debug("调试信息")
 * log.info("信息")
 * log.warn("警告信息")
 * log.error("错误信息")[打印错误信息，一般用于全局异常处理器中使用]
 */
@Slf4j
@Api(tags = "01.用户模块")
@RestController
@RequestMapping("/v1/users/")
public class UserController {
    // 自动装配
    @Autowired
    private UserMapper userMapper;

    /*
    1、注册功能
      根据API文档需要创建dto

     */
    @ApiOperation(value = "注册功能")
    @PostMapping("reg")
    // @RequestBody 将js对象的数据转为json数据格式
    // @Validated 表示校验
    public JsonResult reg(@RequestBody @Validated UserRegDTO userRegDTO){
        // 打印调试信息
        log.debug("userRegDTO = " + userRegDTO);
        // 测试是否拿到数据
        System.out.println(userRegDTO);
        /*
        1、接收客户端传递的数据
        2、数据合法性校验[此处暂不校验]
        3、确认用户名是否被占用[SELECT 接口]
           3.1 如果被占用，返回2  // 返回值根据API文档确定返回内容
           3.2 如果未被占用，插入数据[INSERT 接口] return 1
         */
        String username = userRegDTO.getUsername();
        UserVO userVO = userMapper.selectByUsername(username);
        if (userVO != null){  // 被占用
            return new JsonResult(StatusCode.USERNAME_EXIST);
        }
        // 插入数据
        User user = new User();
        BeanUtils.copyProperties(userRegDTO,user);
        userMapper.insertUser(user);
        return JsonResult.success();
    }
    @ApiOperation(value = "登录功能")
    @PostMapping("login")
    public JsonResult login(@RequestBody UserLoginDTO userLoginDTO,@ApiIgnore HttpSession session){

        // 拿到用户名
        String username= userLoginDTO.getUsername();

        // 调用查询方法
        log.debug("userLoginDTO = " + userLoginDTO);
        UserVO userVO = userMapper.selectByUsername(username);
        // 下面这种语法在实际开发中不推荐使用，代码意图不明显
       /* if(userVO != null){ // 用户存在
            // 获取密码
            if(userVO.getPassword().equals(userLoginDTO.getPassword())){
                return 1;
            }else{
                return 2;
            }
        }else{
            return 3;
        }*/

        if(userVO == null){
            return new JsonResult(StatusCode.USERNAME_ERROR);
        }
        if(!userVO.getPassword().equals(userLoginDTO.getPassword())){
            return new JsonResult(StatusCode.PASSWORD_ERROR);
        }
           /*
        将用户信息存储到session中
        HttpSession session  下面所有的操作都在服务器内存中，主机端不保存
        设置唯一标识 session.setAttribute("user",userVO);
        获取唯一标识 session.getAttribute("user");
        删除唯一标识 session.removeAttribute("user");
         */
        session.setAttribute("user",userVO);
        return JsonResult.success();

    }

    @ApiOperation(value = "获取用户信息")
    @GetMapping("currentUser")
    public JsonResult currentUser(@ApiIgnore HttpSession session){
        // 获取session会话中的用户信息
        UserVO userVO = (UserVO) session.getAttribute("user");

        return JsonResult.success(userVO);
    }
    /* 退出登录
    测试： 1、登录
          2、退出
     */
    @ApiOperation(value = "退出登录")
    @GetMapping("logout")
    public void logout(@ApiIgnore HttpSession session){
        // 删除会话信息
        session.removeAttribute("user");
    }
}
